struct MixedRadix{ // 变进制，不可变类

using value_type = long long;

public:
// vec表示变进制的每一位数
MixedRadix(vector<value_type>&&vec):data(std::move(vec)),value(0){
    assert(data.size() <= Radix.size());
    // 补足
    while(data.size() < Radix.size()) this->data.emplace_back(0);
    value_type d = 1;
    for(int i=0,n=Radix.size();i<n;++i){
        assert(data[i] < Radix[i]);
        value += d * this->data[i];
        d *= Radix[i];
    }
    return;
}

public:
// n是非负整数
MixedRadix(value_type param=0):value(param){
    if(0 == param){
        data.assign(1, 0);
        return;
    }

    for(int i=0,n=Radix.size();i<n;++i){
        this->data.emplace_back(param % Radix[i]);
        param /= Radix[i];
    }
    // 可能包含前导0
    assert(0 == param);
    return; 
}

public:
value_type getDec() const {
    return this->value;
}
const vector<value_type> & getMixed() const {
    return this->data;
}

// 设置Base，vec最好从大到小
static void setRadix(const vector<value_type>&vec){
    Radix.assign(vec.begin(), vec.end());
}

// 设置Base，vec最好从大到小
static void setRadix(vector<value_type>&&vec){
    Radix.swap(vec);
}

private:
// 0表示最低位
vector<value_type> data;  // 变进制数位
value_type value;         // 十进制数值

public:
static vector<value_type> Radix; // 共用一个进制
};

vector<MixedRadix::value_type> MixedRadix::Radix;